import java.util.Arrays;

public class Test {
    public static void main(String[] args) {
        //equals 比较数组内容
        int[] array1 = {1,2,3,4,5};
        int[] array2 = {1,2,3,4,5};
        System.out.println(Arrays.equals(array1,array2));//返回值boolean
        //fill填充
        int[] array3 = new int[10];
//        Arrays.fill(array3,99);//填充数组，填充数值
//        System.out.println(Arrays.toString(array3));
        Arrays.fill(array3,1,3,99);//局部填充 左闭右开 [)
        System.out.println(Arrays.toString(array3));
    }
    public static void main5(String[] args) {
        //二分查找(条件：有序)
        int[] array = {11,33,22,55,44,66};
        Arrays.sort(array);
        System.out.println(Arrays.toString(array));
        int ret = Arrays.binarySearch(array,99);//不存在返回 -(数组元素个数 + 1)
        System.out.println(ret);
    }
    public static void main4(String[] args) {
        //数组拷贝
        int[] array = {1,2,3,4,5};
        //自我实现数组拷贝
//        int[] copy = new int[array.length];
//        for(int i = 0;i < array.length;i++) {
//            copy[i] = array[i];
//        }
//        System.out.println(Arrays.toString(copy));
        //使用Arrays方法实现数组拷贝
        int[] copy = Arrays.copyOf(array,array.length);//拷贝数组,数组长度
        System.out.println(Arrays.toString(copy));
        //使用Arrays方法拷贝数组范围内数据
        int[] copy1 = Arrays.copyOfRange(array,1,3);//左闭右开[1,3)
        System.out.println(Arrays.toString(copy1));
        //使用Arrays方法进行扩容直接方法*要扩容的倍数
        array = Arrays.copyOf(array,array.length * 2);
        System.out.println(Arrays.toString(array));
        //调用本地方法栈上面使用C/C++实现的System.arraycopy方法(拷贝方法的基础实现就是使用System.copy)
        int[] copy2 = new int[array.length];
        System.arraycopy(array,0,copy2,0,array.length);//被拷贝数组，拷贝其实位置，目标数组，目标数组开始位置，拷贝长度
        System.out.println(Arrays.toString(copy2));
        //进行克隆拷贝
        int[] copy3 = array.clone();
        System.out.println(Arrays.toString(copy3));
    }
    public static void main3(String[] args) {
        int[] array = {1,2,34,5};
        String ret = myToString(array);
        System.out.println(ret);
    }

    /**
     * 把一个数组转化为字符串
     * @param array 数组参数
     * return 将数组参数作为字符串返回
     */
    public static String myToString(int[] array) {
        if(array == null) {//判断是否为null
            return "null";
        }
        String ret = "[";//首先有一个左中括号

        for(int i = 0;i < array.length;i++) {//进行拼接
            ret += array[i];
            if(i < array.length - 1) {//拼接逗号，最后一个数字没有逗号
                ret += ",";
            }
        }
        ret += "]";//循环完成，加右中括号
        return ret;
    }
    public static void print(int[] array) {
        for(int i = 0;i < array.length;i++) {
            System.out.print(array[i] + " ");
        }
        System.out.println();
    }
    public static void func1(int[] array) {
        array = new int[]{11,22,33,44,55};//new了一个新对象，所以在堆上开辟了新的空间，
                                            // 不过因为是形参，所以方法结束，在堆上开辟的空间会被jvm回收
    }
    public static void func2(int[] array) {
        array[0] = 99;//因为形参和实参指向堆上相同位置，所以更改形参值相当于更改实参值
    }
    public static void func3(int x) {
         x = 0;
    }
    public static int[] func4() {
        int[] array = {1,23,4,5};
        return  array;
    }
    public static void main2(String[] args) {
        //数组应用场景
        //1.存储数据
        int[] array = {1,2,3,4,5};
        //2.作为函数参数
        //2.1传引用类型，可以改变数组值，但不一定能改变数组值
        //print(array);
        //修改数组指向
     /*   func1(array);
        System.out.println(Arrays.toString(array));*///所以打印原来数组
        //修改数组值
        func2(array);
        System.out.println(Arrays.toString(array));//打印99 2 3 4 5
        //传基本数据类型变量
        int x = 10;
        func3(x);
        System.out.println(x);
        //数组作为返回值
        int[] ret = func4();
        System.out.println(Arrays.toString(ret));
    }
    public static void  main1(String[] args) {
        //遍历数组
        int[] array = {1,2,3,4,5};
        //for(i)
        for(int i = 0;i < array.length;i++) {
            System.out.print(array[i] + " ");
        }
        System.out.println();
        //for-each:for(数组类型 变量名(相当于给数组取一个别名):数组名(引用))
        //两者区别：可以获得数组下标
        for(int x:array) {
            System.out.print(x + " ");
        }
        System.out.println();
        //数组转化成字符串打印Arrays.toString(数组名(引用))
        System.out.println(Arrays.toString(array));
        //JVM内存布局
        //程序计数器：存储下一条执行指令的地址(即目前正在做这件事，然后有紧急的事出现，你需要记下目前做事的进度，然后去做紧急的事)
        //虚拟机栈：每个方法执行时都会创建一个栈帧
        //本地方法栈：保存的是C/C++底层实现的代码
        //堆：new创建的对象在堆上
        //方法区：存储已经被加载过的代码
        //int[] array = null;//表示该数组不指向任何对象
    }
}
